package com.wz.utils.generic;

/**
 * 尽管 Apple[] 可以 “向上转型” 为 Fruit[]，
 * 但数组元素的实际类型还是 Apple，
 * 我们只能向数组中放入 Apple或者 Apple 的子类。
 *
 * 可以通过编译的，但是在运行时期会抛出异常
 * 泛型设计的目的之一是要使这种运行时期的错误在编译期就能发现
 * ArrayList<Apple> 不是 ArrayList<Fruit> 的子类型，泛型不支持协变。
 */
public class CovariantArrays {
    public static void main(String[] args) {       
        Fruit[] fruit = new Apple[10];
        fruit[0] = new Apple(); // OK
        fruit[1] = new Jonathan(); // OK
        // Runtime type is Apple[], not Fruit[] or Orange[]:
        try {
            // Compiler allows you to add Fruit:
            fruit[0] = new Fruit(); // ArrayStoreException
        } catch(Exception e) { System.out.println(e); }
        try {
            // Compiler allows you to add Oranges:
            fruit[0] = new Orange(); // ArrayStoreException
        } catch(Exception e) { System.out.println(e); }
        }
}